package com.jcli.novel_p;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.Properties;

/**
 * 3.0.界面显示更新版。
 * 使用JTable来实现，在打开界面时显示所有键值对，并在更改后自动刷新。
 * 在界面中使用一个表格来显示所有的键值对，并在更改属性时自动刷新。
 * 用户可以通过键文本框和值文本框输入新的属性，并通过“添加属性”按钮来添加它们。
 * 添加后，表格会自动刷新以显示最新的属性。
 * 1.在键值对后面添加删除按钮，点击删除，确认后则删除对应键值对。添加退出按钮。
 * 2.添加一个一键删除所有键值对的按钮。添加搜索功能，输入键能查找对应的键值对。添加分页表格分页功能，每页最多显示20行键值对。
 */
public class WriteToPropertiesSwingUpdated {
    private Properties properties;
    private int addedCount = 0;
    private JFrame frame;
    private DefaultTableModel tableModel;
    private JTable table;

    public WriteToPropertiesSwingUpdated() {
        properties = new Properties();

        try (InputStream inputStream = new FileInputStream("src/main/resources/config.properties")) {
            properties.load(new InputStreamReader(inputStream, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 创建Swing界面
        frame = new JFrame("配置属性编辑器");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 400);
        frame.setLayout(new BorderLayout());

        // 创建表格模型和表格
        tableModel = new DefaultTableModel();
        tableModel.addColumn("键");
        tableModel.addColumn("值");
        table = new JTable(tableModel);

        // 将属性加载到表格模型中
        loadPropertiesToTableModel();

        // 创建文本框和按钮
        JTextField keyTextField = new JTextField(20);
        JTextField valueTextField = new JTextField(20);
        JButton addButton = new JButton("添加属性");
        // JButton deleteAllButton = new JButton("删除所有属性"); // 添加删除所有按钮

        JButton clearButton = new JButton("清空所有属性");// 创建按钮

        // 创建面板以容纳文本框和按钮
        JPanel inputPanel = new JPanel();
        inputPanel.add(new JLabel("键:"));
        inputPanel.add(keyTextField);
        inputPanel.add(new JLabel("值:"));
        inputPanel.add(valueTextField);
        inputPanel.add(addButton);
        // inputPanel.add(deleteAllButton); // 将删除所有按钮添加到面板

        // 将清空按钮添加到界面
        inputPanel.add(clearButton);

        // 添加按钮的点击事件监听器
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String key = keyTextField.getText().trim();
                String value = valueTextField.getText().trim();

                if (key.isEmpty() || value.isEmpty()) {
                    JOptionPane.showMessageDialog(frame, "键和值不能为空。", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                if (properties.containsKey(key)) {
                    JOptionPane.showMessageDialog(frame, "键 '" + key + "' 已存在，跳过该项。", "警告", JOptionPane.WARNING_MESSAGE);
                } else if (properties.containsValue(value)) {
                    Set<String> keys = properties.stringPropertyNames();
                    boolean valueExistsWithDifferentKey = false;

                    for (String existingKey : keys) {
                        if (properties.getProperty(existingKey).equals(value) && !existingKey.equals(key)) {
                            valueExistsWithDifferentKey = true;
                            break;
                        }
                    }

                    if (valueExistsWithDifferentKey) {
                        int option = JOptionPane.showConfirmDialog(frame, "值 '" + value + "' 已存在，但键不同。是否录入已有的键值对？", "确认", JOptionPane.YES_NO_OPTION);
                        if (option == JOptionPane.YES_OPTION) {
                            properties.setProperty(key, value);
                            addedCount++;
                            JOptionPane.showMessageDialog(frame, "键 '" + key + "' ='" + value + "' 已录入成功。", "提示", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(frame, "已跳过键 '" + key + "' 的录入。", "提示", JOptionPane.INFORMATION_MESSAGE);
                        }
                    } else {
                        JOptionPane.showMessageDialog(frame, "值 '" + value + "' 已存在，但键相同，跳过该项。", "警告", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    properties.setProperty(key, value);
                    addedCount++;
                    JOptionPane.showMessageDialog(frame, "键 '" + key + "' ='" + value + "' 已录入成功。", "提示", JOptionPane.INFORMATION_MESSAGE);
                }

                // 清空文本框
                keyTextField.setText("");
                valueTextField.setText("");

                // 将属性加载到表格模型中并刷新表格
                loadPropertiesToTableModel();
            }
        });

        // 添加按钮的点击事件监听器
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int option = JOptionPane.showConfirmDialog(frame, "确定要清空所有属性吗？", "确认", JOptionPane.YES_NO_OPTION);
                if (option == JOptionPane.YES_OPTION) {
                    // 清空properties对象
                    properties.clear();

                    // 保存清空后的properties对象到config.properties文件
                    try (OutputStream outputStream = new FileOutputStream("src/main/resources/config.properties")) {
                        properties.store(outputStream, null);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }

                    // 清空表格模型
                    loadPropertiesToTableModel();

                    JOptionPane.showMessageDialog(frame, "所有属性已被清空。", "提示", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });

        // 添加删除所有按钮的点击事件监听器
        /*deleteAllButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int option = JOptionPane.showConfirmDialog(frame,
                        "您确定要删除所有键值对吗？", "确认删除", JOptionPane.YES_NO_OPTION);

                if (option == JOptionPane.YES_OPTION) {
                    // 用户确认删除，清空键值对
                    properties.clear();
                    addedCount = 0;
                    // 清空表格模型
                    tableModel.setRowCount(0);
                }
            }
        });*/

        // 添加表格到滚动窗格
        JScrollPane tableScrollPane = new JScrollPane(table);

        // 将组件添加到界面
        frame.add(inputPanel, BorderLayout.NORTH);
        frame.add(tableScrollPane, BorderLayout.CENTER);

        // 显示初始的所有键值对
        frame.setVisible(true);
    }

    private void loadPropertiesToTableModel() {
        // 清空表格模型
        tableModel.setRowCount(0);

        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            tableModel.addRow(new Object[]{key, value});
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new WriteToPropertiesSwingUpdated();
            }
        });
    }
}
